/** Reflect
Reflect出现是为了将Object对象的一些明显属于语言内部的系统方法(比如Object.defineProperty),放到Reflect对象上*/
/*
Object.defineProperty()
Object.getOwnPropertyDescriptor()
Object.getPrototypeOf()
...
*/

const target = {
  name: 'red hat',
  age: 123
};

//Reflect.defineProperty
/*Reflect.defineProperty(target, 'love', {
  value: 'white shoes'
});*/
console.log('love' in target); // true
console.log(target['love']); // white shoes


/** 为什么打印就不可见呢？*/
console.log(target); // { name: 'red hat', age: 123 }

/** 因为默认是不可枚举的*/
console.log(Reflect.getOwnPropertyDescriptor(target, 'love'));
/*
{ value: 'white shoes',
  writable: false,
  enumerable: false,
  configurable: false }
*/

/** 需要注意的是因为configurable默认也为false,so不能重复对该属性进行defineProperty(我们需要注释掉上面的defineProperty,然后↓设置的才会生效)*/
Reflect.defineProperty(target, 'love', {
  value: 'white shoes',
  writable: true,
  enumerable: true,
  configurable: true
});

console.log(target); // { name: 'red hat', age: 123, love: 'white shoes' }


